home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / site-packages / Numeric / RandomArray.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2006-03-29  |  15KB  |  378 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import ranlib
  5. import Numeric
  6. import LinearAlgebra
  7. import sys
  8. import math
  9. from types import *
  10.  
  11. class ArgumentError(Exception):
  12.     pass
  13.  
  14.  
  15. def seed(x = 0, y = 0):
  16.     '''seed(x, y), set the seed using the integers x, y; 
  17.     Set a random one from clock if  y == 0
  18.     '''
  19.     if type(x) != IntType or type(y) != IntType:
  20.         raise ArgumentError, 'seed requires integer arguments.'
  21.     
  22.     if y == 0:
  23.         import time as time
  24.         t = time.time()
  25.         ndigits = int(math.log10(t))
  26.         base = 10 ** (ndigits / 2)
  27.         x = int(t / base)
  28.         y = 1 + int(t % base)
  29.     
  30.     ranlib.set_seeds(x, y)
  31.  
  32. seed()
  33.  
  34. def get_seed():
  35.     '''Return the current seed pair'''
  36.     return ranlib.get_seeds()
  37.  
  38.  
  39. def _build_random_array(fun, args, shape = []):
  40.     if isinstance(shape, IntType):
  41.         shape = [
  42.             shape]
  43.     
  44.     if len(shape) != 0:
  45.         n = Numeric.multiply.reduce(shape)
  46.         s = apply(fun, args + (n,))
  47.         s.shape = shape
  48.         return s
  49.     else:
  50.         n = 1
  51.         s = apply(fun, args + (n,))
  52.         return s[0]
  53.  
  54.  
  55. def random(shape = []):
  56.     '''random(n) or random([n, m, ...]) returns array of random numbers'''
  57.     return _build_random_array(ranlib.sample, (), shape)
  58.  
  59.  
  60. def uniform(minimum, maximum, shape = []):
  61.     '''uniform(minimum, maximum, shape=[]) returns array of given shape of random reals 
  62.     in given range'''
  63.     return minimum + (maximum - minimum) * random(shape)
  64.  
  65.  
  66. def randint(minimum, maximum = None, shape = []):
  67.     '''randint(min, max, shape=[]) = random integers >=min, < max
  68.     If max not given, random integers >= 0, <min'''
  69.     if not isinstance(minimum, IntType):
  70.         raise ArgumentError, 'randint requires first argument integer'
  71.     
  72.     if maximum is None:
  73.         maximum = minimum
  74.         minimum = 0
  75.     
  76.     if not isinstance(maximum, IntType):
  77.         raise ArgumentError, 'randint requires second argument integer'
  78.     
  79.     a = (maximum - minimum) * random(shape)
  80.     if isinstance(a, Numeric.ArrayType):
  81.         return minimum + a.astype(Numeric.Int)
  82.     else:
  83.         return minimum + int(a)
  84.  
  85.  
  86. def random_integers(maximum, minimum = 1, shape = []):
  87.     '''random_integers(max, min=1, shape=[]) = random integers in range min-max inclusive'''
  88.     return randint(minimum, maximum + 1, shape)
  89.  
  90.  
  91. def permutation(n):
  92.     '''permutation(n) = a permutation of indices range(n)'''
  93.     return Numeric.argsort(random(n))
  94.  
  95.  
  96. def standard_normal(shape = []):
  97.     '''standard_normal(n) or standard_normal([n, m, ...]) returns array of
  98.            random numbers normally distributed with mean 0 and standard
  99.            deviation 1'''
  100.     return _build_random_array(ranlib.standard_normal, (), shape)
  101.  
  102.  
  103. def normal(mean, std, shape = []):
  104.     '''normal(mean, std, n) or normal(mean, std, [n, m, ...]) returns
  105.            array of random numbers randomly distributed with specified mean and
  106.            standard deviation'''
  107.     s = standard_normal(shape)
  108.     return s * std + mean
  109.  
  110.  
  111. def multivariate_normal(mean, cov, shape = []):
  112.     '''multivariate_normal(mean, cov) or multivariate_normal(mean, cov, [m, n, ...])
  113.           returns an array containing multivariate normally distributed random numbers
  114.           with specified mean and covariance.
  115.  
  116.           mean must be a 1 dimensional array. cov must be a square two dimensional
  117.           array with the same number of rows and columns as mean has elements.
  118.  
  119.           The first form returns a single 1-D array containing a multivariate
  120.           normal.
  121.  
  122.           The second form returns an array of shape (m, n, ..., cov.shape[0]).
  123.           In this case, output[i,j,...,:] is a 1-D array containing a multivariate
  124.           normal.'''
  125.     mean = Numeric.array(mean)
  126.     cov = Numeric.array(cov)
  127.     if len(mean.shape) != 1:
  128.         raise ArgumentError, 'mean must be 1 dimensional.'
  129.     
  130.     if len(cov.shape) != 2 or cov.shape[0] != cov.shape[1]:
  131.         raise ArgumentError, 'cov must be 2 dimensional and square.'
  132.     
  133.     if mean.shape[0] != cov.shape[0]:
  134.         raise ArgumentError, 'mean and cov must have same length.'
  135.     
  136.     if isinstance(shape, IntType):
  137.         shape = [
  138.             shape]
  139.     
  140.     final_shape = list(shape[:])
  141.     final_shape.append(mean.shape[0])
  142.     x = ranlib.standard_normal(Numeric.multiply.reduce(final_shape))
  143.     x.shape = (Numeric.multiply.reduce(final_shape[0:len(final_shape) - 1]), mean.shape[0])
  144.     (u, s, v) = LinearAlgebra.singular_value_decomposition(cov)
  145.     x = Numeric.matrixmultiply(x * Numeric.sqrt(s), v)
  146.     Numeric.add(mean, x, x)
  147.     x.shape = final_shape
  148.     return x
  149.  
  150.  
  151. def exponential(mean, shape = []):
  152.     '''exponential(mean, n) or exponential(mean, [n, m, ...]) returns array
  153.       of random numbers exponentially distributed with specified mean'''
  154.     x = random(shape)
  155.     Numeric.log(x, x)
  156.     Numeric.subtract(0.0, x, x)
  157.     Numeric.multiply(mean, x, x)
  158.     return x
  159.  
  160.  
  161. def beta(a, b, shape = []):
  162.     '''beta(a, b) or beta(a, b, [n, m, ...]) returns array of beta distributed random numbers.'''
  163.     return _build_random_array(ranlib.beta, (a, b), shape)
  164.  
  165.  
  166. def gamma(a, r, shape = []):
  167.     '''gamma(a, r) or gamma(a, r, [n, m, ...]) returns array of gamma distributed random numbers.'''
  168.     return _build_random_array(ranlib.gamma, (a, r), shape)
  169.  
  170.  
  171. def F(dfn, dfd, shape = []):
  172.     '''F(dfn, dfd) or F(dfn, dfd, [n, m, ...]) returns array of F distributed random numbers with dfn degrees of freedom in the numerator and dfd degrees of freedom in the denominator.'''
  173.     return chi_square(dfn, shape) / dfn / chi_square(dfd, shape) / dfd
  174.  
  175.  
  176. def noncentral_F(dfn, dfd, nconc, shape = []):
  177.     '''noncentral_F(dfn, dfd, nonc) or noncentral_F(dfn, dfd, nonc, [n, m, ...]) returns array of noncentral F distributed random numbers with dfn degrees of freedom in the numerator and dfd degrees of freedom in the denominator, and noncentrality parameter nconc.'''
  178.     return noncentral_chi_square(dfn, nconc, shape) / dfn / chi_square(dfd, shape) / dfd
  179.  
  180.  
  181. def chi_square(df, shape = []):
  182.     '''chi_square(df) or chi_square(df, [n, m, ...]) returns array of chi squared distributed random numbers with df degrees of freedom.'''
  183.     return _build_random_array(ranlib.chisquare, (df,), shape)
  184.  
  185.  
  186. def noncentral_chi_square(df, nconc, shape = []):
  187.     '''noncentral_chi_square(df, nconc) or chi_square(df, nconc, [n, m, ...]) returns array of noncentral chi squared distributed random numbers with df degrees of freedom and noncentrality parameter.'''
  188.     return _build_random_array(ranlib.noncentral_chisquare, (df, nconc), shape)
  189.  
  190.  
  191. def binomial(trials, p, shape = []):
  192.     '''binomial(trials, p) or binomial(trials, p, [n, m, ...]) returns array of binomially distributed random integers.
  193.  
  194.            trials is the number of trials in the binomial distribution.
  195.            p is the probability of an event in each trial of the binomial distribution.'''
  196.     return _build_random_array(ranlib.binomial, (trials, p), shape)
  197.  
  198.  
  199. def negative_binomial(trials, p, shape = []):
  200.     '''negative_binomial(trials, p) or negative_binomial(trials, p, [n, m, ...]) returns
  201.            array of negative binomially distributed random integers.
  202.  
  203.            trials is the number of trials in the negative binomial distribution.
  204.            p is the probability of an event in each trial of the negative binomial distribution.'''
  205.     return _build_random_array(ranlib.negative_binomial, (trials, p), shape)
  206.  
  207.  
  208. def multinomial(trials, probs, shape = []):
  209.     '''multinomial(trials, probs) or multinomial(trials, probs, [n, m, ...]) returns
  210.            array of multinomial distributed integer vectors.
  211.  
  212.            trials is the number of trials in each multinomial distribution.
  213.            probs is a one dimensional array. There are len(prob)+1 events. 
  214.            prob[i] is the probability of the i-th event, 0<=i<len(prob).
  215.            The probability of event len(prob) is 1.-Numeric.sum(prob).
  216.  
  217.        The first form returns a single 1-D array containing one multinomially
  218.            distributed vector.
  219.  
  220.            The second form returns an array of shape (m, n, ..., len(probs)).
  221.            In this case, output[i,j,...,:] is a 1-D array containing a multinomially
  222.            distributed integer 1-D array.'''
  223.     probs = Numeric.array(probs)
  224.     if len(probs.shape) != 1:
  225.         raise ArgumentError, 'probs must be 1 dimensional.'
  226.     
  227.     if type(shape) == type(0):
  228.         shape = [
  229.             shape]
  230.     
  231.     final_shape = shape[:]
  232.     final_shape.append(probs.shape[0] + 1)
  233.     x = ranlib.multinomial(trials, probs.astype(Numeric.Float32), Numeric.multiply.reduce(shape))
  234.     x.shape = final_shape
  235.     return x
  236.  
  237.  
  238. def poisson(mean, shape = []):
  239.     '''poisson(mean) or poisson(mean, [n, m, ...]) returns array of poisson
  240.            distributed random integers with specifed mean.'''
  241.     return _build_random_array(ranlib.poisson, (mean,), shape)
  242.  
  243.  
  244. def mean_var_test(x, type, mean, var, skew = []):
  245.     n = len(x) * 1.0
  246.     x_mean = Numeric.sum(x) / n
  247.     x_minus_mean = x - x_mean
  248.     x_var = Numeric.sum(x_minus_mean * x_minus_mean) / (n - 1.0)
  249.     print '\nAverage of ', len(x), type
  250.     print '(should be about ', mean, '):', x_mean
  251.     print 'Variance of those random numbers (should be about ', var, '):', x_var
  252.     if skew != []:
  253.         x_skew = Numeric.sum(x_minus_mean * x_minus_mean * x_minus_mean) / 9998.0 / x_var ** (3.0 / 2.0)
  254.         print 'Skewness of those random numbers (should be about ', skew, '):', x_skew
  255.     
  256.  
  257.  
  258. def test():
  259.     (x, y) = get_seed()
  260.     print 'Initial seed', x, y
  261.     seed(x, y)
  262.     (x1, y1) = get_seed()
  263.     if x1 != x or y1 != y:
  264.         raise SystemExit, 'Failed seed test.'
  265.     
  266.     print 'First random number is', random()
  267.     print 'Average of 10000 random numbers is', Numeric.sum(random(10000)) / 10000.0
  268.     x = random([
  269.         10,
  270.         1000])
  271.     if len(x.shape) != 2 and x.shape[0] != 10 or x.shape[1] != 1000:
  272.         raise SystemExit, 'random returned wrong shape'
  273.     
  274.     x.shape = (10000,)
  275.     print 'Average of 100 by 100 random numbers is', Numeric.sum(x) / 10000.0
  276.     y = uniform(0.5, 0.59999999999999998, (1000, 10))
  277.     if len(y.shape) != 2 and y.shape[0] != 1000 or y.shape[1] != 10:
  278.         raise SystemExit, 'uniform returned wrong shape'
  279.     
  280.     y.shape = (10000,)
  281.     if Numeric.minimum.reduce(y) <= 0.5 or Numeric.maximum.reduce(y) >= 0.59999999999999998:
  282.         raise SystemExit, 'uniform returned out of desired range'
  283.     
  284.     print 'randint(1, 10, shape=[50])'
  285.     print randint(1, 10, shape = [
  286.         50])
  287.     print 'permutation(10)', permutation(10)
  288.     print 'randint(3,9)', randint(3, 9)
  289.     print 'random_integers(10, shape=[20])'
  290.     print random_integers(10, shape = [
  291.         20])
  292.     s = 3.0
  293.     x = normal(2.0, s, [
  294.         10,
  295.         1000])
  296.     if len(x.shape) != 2 and x.shape[0] != 10 or x.shape[1] != 1000:
  297.         raise SystemExit, 'standard_normal returned wrong shape'
  298.     
  299.     x.shape = (10000,)
  300.     mean_var_test(x, 'normally distributed numbers with mean 2 and variance %f' % (s ** 2,), 2, s ** 2, 0)
  301.     x = exponential(3, 10000)
  302.     mean_var_test(x, 'random numbers exponentially distributed with mean %f' % (s,), s, s ** 2, 2)
  303.     x = multivariate_normal(Numeric.array([
  304.         10,
  305.         20]), Numeric.array(([
  306.         1,
  307.         2], [
  308.         2,
  309.         4])))
  310.     print '\nA multivariate normal', x
  311.     if x.shape != (2,):
  312.         raise SystemExit, 'multivariate_normal returned wrong shape'
  313.     
  314.     x = multivariate_normal(Numeric.array([
  315.         10,
  316.         20]), Numeric.array([
  317.         [
  318.             1,
  319.             2],
  320.         [
  321.             2,
  322.             4]]), [
  323.         4,
  324.         3])
  325.     print 'A 4x3x2 array containing multivariate normals'
  326.     print x
  327.     if x.shape != (4, 3, 2):
  328.         raise SystemExit, 'multivariate_normal returned wrong shape'
  329.     
  330.     x = multivariate_normal(Numeric.array([
  331.         -100,
  332.         0,
  333.         100]), Numeric.array([
  334.         [
  335.             3,
  336.             2,
  337.             1],
  338.         [
  339.             2,
  340.             2,
  341.             1],
  342.         [
  343.             1,
  344.             1,
  345.             1]]), 10000)
  346.     x_mean = Numeric.sum(x) / 10000.0
  347.     print 'Average of 10000 multivariate normals with mean [-100,0,100]'
  348.     print x_mean
  349.     x_minus_mean = x - x_mean
  350.     print 'Estimated covariance of 10000 multivariate normals with covariance [[3,2,1],[2,2,1],[1,1,1]]'
  351.     print Numeric.matrixmultiply(Numeric.transpose(x_minus_mean), x_minus_mean) / 9999.0
  352.     x = beta(5.0, 10.0, 10000)
  353.     mean_var_test(x, 'beta(5.,10.) random numbers', 0.33300000000000002, 0.014)
  354.     x = gamma(0.01, 2.0, 10000)
  355.     mean_var_test(x, 'gamma(.01,2.) random numbers', 2 * 100, 2 * 100 * 100)
  356.     x = chi_square(11.0, 10000)
  357.     mean_var_test(x, 'chi squared random numbers with 11 degrees of freedom', 11, 22, 2 * Numeric.sqrt(2.0 / 11.0))
  358.     x = F(5.0, 10.0, 10000)
  359.     mean_var_test(x, 'F random numbers with 5 and 10 degrees of freedom', 1.25, 1.3500000000000001)
  360.     x = poisson(50.0, 10000)
  361.     mean_var_test(x, 'poisson random numbers with mean 50', 50, 50, 0.14000000000000001)
  362.     print '\nEach element is the result of 16 binomial trials with probability 0.5:'
  363.     print binomial(16, 0.5, 16)
  364.     print '\nEach element is the result of 16 negative binomial trials with probability 0.5:'
  365.     print negative_binomial(16, 0.5, [
  366.         16])
  367.     print '\nEach row is the result of 16 multinomial trials with probabilities [0.1, 0.5, 0.1 0.3]:'
  368.     x = multinomial(16, [
  369.         0.10000000000000001,
  370.         0.5,
  371.         0.10000000000000001], 8)
  372.     print x
  373.     print 'Mean = ', Numeric.sum(x) / 8.0
  374.  
  375. if __name__ == '__main__':
  376.     test()
  377.  
  378.